﻿using System;
using System.Linq;
using System.Web.Mvc;
using Telerik.Web.Mvc;
using Helena.Areas.Ventas.Models;
using Helena.Areas.Categorias.Models;
using Helena.Areas.Campanas.Models;
using Helena.Areas.Configuraciones.Models;
using Helena.Areas.Productos.Models;
using Helena.Areas.Vendedores.Models;
using System.Collections.Generic;


namespace Helena.Areas.Ventas.Controllers
{
    public class DetalleVentaController : Controller
    {
        LogicaVenta db = new LogicaVenta();
        LogicaCategoria cat_db = new LogicaCategoria();
        LogicaCampana cam_db = new LogicaCampana();
        LogicaUnidad uni_db = new LogicaUnidad();
        LogicaProducto pro_db = new LogicaProducto();
        LogicaConfiguraciones conf_db = new LogicaConfiguraciones();
        
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Index()
        {
            VendedorView vw = (VendedorView)Session["Vendedor"];
            if (vw.ID != 0)
            {
                ObtenerProductos();
                ObtenerUnidades();


                ViewData["Campanas"] = cam_db.i_RetornarCampanas().Where(e => e.Estado == true).ToList();
                ViewData["Categorias"] = cat_db.i_RetornarCategorias().Where(e => e.Estado == true).ToList();
                ViewData["Productos"] = new List<ProductoView>();
                ViewData["_Nombre"] = "Anual";

                if (Session["NuevaVenta"] == null)
                {
                    Venta v = new Venta();
                    v.Fecha = DateTime.Now;
                    v.vendedorID = ((VendedorView)Session["Vendedor"]).ID;
                    v.ValorTipoCambio = conf_db.ObtenerUltimaConfiguracion(1).TipoCambio;
                    v.clienteID = 1;
                    v.tarjetaID = 1;
                    Session["NuevaVenta"] = new VentaView(v);
                    Session["Detalle"] = new List<DetalleVentaView>();
                }

                return View();
            }
            else
            {
                return Redirect("../Home/NoSession");
            }


        }

        [GridAction]
        public ActionResult ObtenerCategorias()
        {
            return View(new GridModel<CategoriaView>
            {
                Data = cat_db.i_RetornarCategorias().Where(e => e.Estado == true).ToList()
            });
        }

        [GridAction]
        public ActionResult ObtenerCampanas()
        {
            return View(new GridModel<CampanaView>
            {
                Data = cam_db.i_RetornarCampanas().Where(e => e.Estado == true).ToList()
            });
        }

        [GridAction]
        public ActionResult Obtener_Productos(String _Nombre)
        {
            _Nombre = _Nombre ?? "Anual";
            
            int CampanaID = 0;
            int CategoriaID = 0;
            
            try
            {
                CategoriaID = cat_db.i_RetornarCategorias().Where(p => p.NombreCategoria == _Nombre).Where(p=>p.Estado==true).FirstOrDefault().ID;
                Session["CategoriaID"] = CategoriaID;
                Session["CampanaID"] = "";
            }
            catch
            {
                CampanaID = cam_db.i_RetornarCampanas().Where(p => p.NombreCampana == _Nombre).Where(p=>p.Estado==true).FirstOrDefault().ID;
                Session["CampanaID"] = CampanaID;
                Session["CategoriaID"] = "";
            }
            
            ObtenerSalida();

            return View(new GridModel<ProductoView>
            {
                Data = (List<ProductoView>)Session["salida"]
            });
        }

        

        [GridAction]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult InsertarDetalleVenta(ProductoView producto)
        {
            bool pertenece = false;
            List<DetalleVentaView> dl = (List<DetalleVentaView>)Session["Detalle"];

            foreach (var v in dl)
            {
                // si el producto que se desea ingresar ya esta en la lista de detalles NO SE INGRESA
                if (v.ProductoID == producto.ID)
                {
                    pertenece = true;
                }
            }
            if (pertenece == false)
            {
                ProductoView p = pro_db.i_RetornarProducto(producto.ID);
                DetalleVentaView d = new DetalleVentaView();
                try
                {
                    d.ID = ((List<DetalleVentaView>)Session["Detalle"]).Max(x => x.ID) + 1;
                }
                catch
                {
                    d.ID = 1;
                }
                d.ProductoID = p.ID;
                d.CampanaID = p.campanaID;
                d.CategoriaID = p.categoriaID;
                d.NombreProducto = p.Descripcion;
                d.PrecioU = p.precioventa;
                d.UnidadID = p.unidadID;
                d.Cantidad = producto.cantidad;
                d.Subtotal = Math.Round(p.precioventa * Convert.ToDecimal(d.Cantidad), 2);
                d.Igv_del_Subtotal = d.Subtotal * Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().ValorIGV);

                AgregarDetalleVenta(d);

                VentaView v = (VentaView)Session["NuevaVenta"];
                v.Sub_Total += d.Subtotal;
                v.Total_En_Dolares = Math.Round(v.Sub_Total / Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().TipoCambio),2);
                v.Total_En_Soles = v.Sub_Total;
                v.Valor_Del_Igv_En_Soles = v.Sub_Total * Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().ValorIGV);
                Session["NuevaVenta"] = v;



                //v.Total_En_Soles = Math.Round((Convert.ToDecimal(100 - v.Descuento) / 100) * (v.Sub_Total) / (1 + Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().ValorIGV)), 2);
                //v.Total_En_Dolares = Math.Round(v.Total_En_Soles / Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().TipoCambio), 2);
                //v.Valor_Del_Igv_En_Soles = Math.Round(v.Sub_Total - v.Total_En_Soles, 2);
                //Session["NuevaVenta"] = v;
            }

            ObtenerSalida();
            return View(new GridModel((List<ProductoView>)Session["salida"]));
        }

        [GridAction]
        public ActionResult ObtenerDetalles(string VentaID)
        {
            // llena detalle de la venta
            List<DetalleVentaView> dl = new List<DetalleVentaView>();
            try
            {
                dl = (List<DetalleVentaView>)Session["Detalle"];
            }
            catch
            {
                dl = new List<DetalleVentaView>();
            }

            return View(new GridModel<DetalleVentaView>
            {
                Data = (dl)
            });
        }

        [GridAction]
        public ActionResult ModificarDetalles(DetalleVentaView detalle)
        {
            List<DetalleVentaView> dl = (List<DetalleVentaView>)Session["Detalle"];
            VentaView venta = (VentaView)Session["NuevaVenta"];
            venta.Sub_Total = 0;
            List<DetalleVentaView> dlf = new List<DetalleVentaView>();
            
            foreach (var v in dl)
            {
                if (v.ID != detalle.ID)
                {
                    venta.Sub_Total += v.Subtotal;    
                    dlf.Add(v);
                }
                else
                {
                    ProductoView p = pro_db.i_RetornarProducto(v.ProductoID);
                    v.Cantidad = detalle.Cantidad;
                    v.Subtotal = Math.Round(p.precioventa * Convert.ToDecimal(detalle.Cantidad), 2);
                    v.Igv_del_Subtotal = v.Subtotal * Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().ValorIGV);
                    dlf.Add(v);
                    venta.Sub_Total += v.Subtotal; 
                }

            }
            venta.Total_En_Dolares = Math.Round(venta.Sub_Total / Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().TipoCambio),2);
            venta.Total_En_Soles = venta.Sub_Total;
            venta.Valor_Del_Igv_En_Soles = venta.Sub_Total * Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().ValorIGV);

            Session["NuevaVenta"] = venta;

            Session["Detalle"] = dlf;
            
            return View(new GridModel(dlf));
        }

        [GridAction]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult EliminarDetalle(DetalleVentaView detalle)
        {
            List<DetalleVentaView> dl = (List<DetalleVentaView>)Session["Detalle"];
            List<DetalleVentaView> dlf = new List<DetalleVentaView>();
            VentaView venta = (VentaView)Session["NuevaVenta"];
            venta.Sub_Total = 0;

            foreach (var v in dl)
            {
                if (v.ID != detalle.ID)
                {
                    venta.Sub_Total += v.Subtotal;
                    dlf.Add(v);
                }
            }

            venta.Total_En_Dolares = Math.Round(venta.Sub_Total / Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().TipoCambio), 2);
            venta.Total_En_Soles = venta.Sub_Total;
            venta.Valor_Del_Igv_En_Soles = venta.Sub_Total * Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().ValorIGV);

            Session["Detalle"] = dlf;
            Session["NuevaVenta"] = venta;

            return View(new GridModel(dlf));
        }

        #region Extra

        private void ObtenerProductos()
        {
            List<ProductoView> lista =pro_db.i_RetornarProductos().Where(p => p.Estado == true).ToList();
            List<ProductoView> salida = new List<ProductoView>();

            foreach(ProductoView p in lista)
            {
                p.cantidad=0;
                salida.Add(p);
            }

            ViewData["Productos"] = salida;
        }

        private void ObtenerUnidades()
        {
            ViewData["Unidades"] = uni_db.i_RetornarUnidades().Where(u => u.Estado == true).ToList();
        }

        private void AgregarDetalleVenta(DetalleVentaView dv)
        {
            List<DetalleVentaView> detalle = (List<DetalleVentaView>)Session["Detalle"];
            detalle.Add(dv);
            Session["Detalle"] = detalle;
        }

        private void ObtenerSalida()
        {
            List<ProductoView> obtener=null;
            List<ProductoView> salida = new List<ProductoView>();

            if (Session["CampanaID"].ToString() != "")
            {
                obtener = pro_db.i_RetornarProductos().Where(p => p.Estado == true).Where(p => p.campanaID == Convert.ToInt16(Session["CampanaID"].ToString())).ToList();
            }

            if (Session["CategoriaID"].ToString() != "")
            {
                obtener = pro_db.i_RetornarProductos().Where(p => p.Estado == true).Where(p => p.categoriaID == Convert.ToInt16(Session["CategoriaID"].ToString())).ToList();
            }

            foreach (ProductoView p in obtener)
            {
                p.cantidad = 0;
                salida.Add(p);
            }

            Session["salida"] = salida;
        }

        public ActionResult cantidad()
        {
            return PartialView();
        }
        #endregion
    }
}